package com.flowable.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.common.core.domain.AjaxResult;
import com.flowable.domain.dto.BpmProcessInstanceCreateReqDTO;
import com.flowable.domain.dto.FlowSaveXmlVo;
import com.system.domain.FlowProcDefDto;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ProcessDefinition;

import javax.validation.Valid;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.common.utils.CollectionUtils.convertMap;

/**
 * @author Tony
 * @date 2021-04-03 14:41
 */
public interface IFlowDefinitionService {

    boolean exist(String processDefinitionKey);


    /**
     * 流程定义列表
     *
     * @param pageNum  当前页码
     * @param pageSize 每页条数
     * @return 流程定义分页列表数据
     */
    Page<FlowProcDefDto> list(String name,Integer pageNum, Integer pageSize);

    Page<FlowProcDefDto> getProcessDefinitionPage(String name,Integer pageNum, Integer pageSize);

    /**
     * 导入流程文件
     * 当每个key的流程第一次部署时，指定版本为1。对其后所有使用相同key的流程定义，
     * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义
     * @param name
     * @param category
     * @param in
     */
    void importFile(String name, String category, InputStream in);

    void createModel(FlowSaveXmlVo createRetVO);

    /**
     * 修改流程模型
     *
     * @param updateReqVO 更新信息
     */
    void updateModel(FlowSaveXmlVo updateReqVO);

    /**
     * 将流程模型，部署成一个流程定义
     *
     * @param id 编号
     */
    void deployModel(String id);


    void deleteModel(String id);
    /**
     * 读取xml
     * @param deployId
     * @return
     */
    AjaxResult readXml(String deployId) throws IOException;








    /**
     * 激活或挂起流程定义
     *
     * @param state    状态
     * @param deployId 流程部署ID
     */
    void updateState(Integer state, String deployId);


    /**
     * 删除流程定义
     *
     * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值
     */
    void delete(String deployId);


    /**
     * 读取图片文件
     * @param deployId
     * @return
     */
    InputStream readImage(String deployId);

    Model getModel(String id);

    byte[] getModelBpmnXML(String id);
    /**
     * 获得 ids 对应的 ProcessDefinition 数组
     *
     * @param ids 编号的数组
     * @return 流程定义的数组
     */
    List<ProcessDefinition> getProcessDefinitionList(Set<String> ids);
    default Map<String, ProcessDefinition> getProcessDefinitionMap(Set<String> ids) {
        return convertMap(getProcessDefinitionList(ids), ProcessDefinition::getId);
    }
}
